home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / wild / support / profilerlibrary / profiler.library.s < prev    next >
Text File  |  1999-01-01  |  8KB  |  403 lines

  1.  
  2.         include PyperLibMaker.i
  3.         include    PyperMacro.i
  4.         include    profiler.i
  5.         include    devices/timer_lib.i
  6.         include    exec/memory.i
  7.         include    utility/utility_lib.i
  8.         include    devices/timer.i
  9.  
  10.         output    libs:profiler.library
  11.  
  12.         Lib    profiler,1,0,20.11.1998,prob_SIZEOF+128
  13.  
  14.         Lib    FUNCTIONS
  15.         Lib    OpenLib
  16.         Lib    CloseLib
  17.         Lib    ExpugneLib
  18.         Lib    ExtFuncLib
  19.  
  20.         Lib    CreateProfilerHandler
  21.         Lib    DeleteProfilerHandler
  22.         Lib    AddEvent
  23.         Lib    RemEvent
  24.         Lib    NewCycle
  25.         Lib    EventReached
  26.         Lib    EndCycle
  27.         Lib    CreateLog
  28.  
  29.         Lib    CODE
  30.  
  31.         Lib    Init
  32.         exg    a0,d0
  33.         move.l    d0,LIB_SIZE(a0)
  34.         
  35.         movem.l    d0/d1/a0/a1/a5/a6,-(a7)
  36.         movea.l    a0,a5
  37.         movea.l    4.w,a6
  38.         lea.l    utyname,a1
  39.         moveq.l    #36,d0
  40.         Call    OpenLibrary
  41.         move.l    d0,prob_UtilityBase(a5)
  42.         beq.b    .fail
  43.         lea.l    dosname,a1
  44.         moveq.l    #36,d0
  45.         Call    OpenLibrary
  46.         move.l    d0,prob_DOSBase(a5)
  47.         beq.b    .fail
  48.     
  49. .fail        movem.l    (a7)+,d0/d1/a0/a1/a5/a6        ; if Z flag, fail!
  50.         beq.b    .fail2
  51.         exg    a0,d0
  52.         bra.b    .ok
  53. .fail2        moveq.l    #0,d0
  54. .ok        rts
  55.  
  56.         Lib    OpenLib
  57.         add.w    #1,LIB_OPENCNT(a6)
  58.         bset    #LIBB_DELEXP,LIB_FLAGS(a6)    ; MODULES DEFAULT ARE WANTED TO FREE THEIR MEMORY WHEN CLOSED SO THE EXPUGNE FLAG IS SET ,USUALLY. CLEAR IT ONLY IF REALLY NEEDED.
  59.                 
  60.         move.l    a6,d0
  61.         rts
  62.  
  63.         Lib    CloseLib
  64.         subq.w    #1,LIB_OPENCNT(a6)
  65.         bne.b    ExtFuncLib
  66.         btst    #LIBB_DELEXP,LIB_FLAGS(a6)
  67.         beq.b    ExtFuncLib
  68.  
  69.         Lib    ExpugneLib
  70.         movem.l    d2/a5/a6,-(sp)
  71.         tst.w    LIB_OPENCNT(a6) 
  72.         bne.b    .still_openned
  73.  
  74.         movem.l    a5/a6,-(a7)
  75.         movea.l    a6,a5
  76.         Exec
  77.         movea.l    prob_UtilityBase(a5),a1
  78.         Call    CloseLibrary
  79.         movea.l    prob_DOSBase(a5),a1
  80.         Call    CloseLibrary
  81.         movem.l    (a7)+,a5/a6
  82.  
  83.         move.l    LIB_SIZE(a6),d2
  84.         move.l    a6,a5
  85.         move.l    4.w,a6
  86.         move.l    a5,a1
  87.         jsr    _LVORemove(a6)
  88.         move.l    a5,a1
  89.         moveq    #0,d0
  90.         move.w    LIB_NEGSIZE(a5),d0
  91.         sub.w    d0,a1
  92.         add.w    LIB_POSSIZE(a5),d0
  93.         jsr    _LVOFreeMem(a6)
  94.         move.l    d2,d0
  95.         movem.l    (sp)+,d2/a5/a6
  96.         rts
  97. .still_openned
  98.         Lib    ExtFuncLib
  99.         moveq    #0,d0
  100.         rts
  101.  
  102. **************************************************************************************
  103. **************************************************************************************
  104. ** The real code...
  105.  
  106.         Lib    CreateProfilerHandler     ; a0:tags
  107.         movem.l    d2/a2-a6,-(a7)
  108.         suba.l    a3,a3
  109.         movea.l    a6,a5            ; a5:probase
  110.         Exec
  111.         movea.l    a0,a2            ; a2:tags
  112.         moveq.l    #MEMF_ANY,d0
  113.         move.l    #1024,d1
  114.         move.l    #768,d2
  115.         Call    CreatePool
  116.         move.l    d0,d2            ; d2:pool
  117.         beq    .fail
  118.         moveq.l    #ph_SIZEOF,d0
  119.         movea.l    d2,a0
  120.         Call    AllocPooled
  121.         movea.l    d0,a3            ; a3:ph
  122.         tst.l    d0
  123.         beq    .fail
  124.         move.l    d2,ph_Pool(a3)
  125.  
  126.         Call    CreateMsgPort
  127.         move.l    d0,ph_TimerMSG(a3)
  128.         movea.l    d0,a0
  129.         moveq.l    #IOTV_SIZE,d0
  130.         Call    CreateIORequest
  131.         move.l    d0,ph_TimerIO(a3)
  132.         lea.l    timername,a0
  133.         movea.l    d0,a1
  134.         moveq.l    #0,d0
  135.         move.l    d0,d1
  136.         Call    OpenDevice
  137.         tst.l    d0
  138.         bne    .fail
  139.         moveq.l    #-1,d1
  140.         movea.l    ph_TimerIO(a3),a0
  141.         move.l    IO_DEVICE(a0),ph_TimerBase(a3)
  142.  
  143.         move.l    prob_UtilityBase(a5),a6        
  144.         GetTagData    PRF_Name,unp,a2
  145.         move.l    d0,ph_Name(a3)
  146.         GetTagData    PRF_Output,0,a2
  147.         move.l    d0,ph_Output(a3)
  148.         clr.l    ph_Cycles(a3)
  149.         lea.l    ph_EventList(a3),a0
  150.         NEWLIST    a0
  151.         
  152.         GetTagData    PRF_EventsArray,0,a2
  153.         tst.l    d0
  154.         beq.b    .nar
  155.         movea.l    d0,a4
  156.         clr.l    -(a7)
  157.         clr.l    -(a7)
  158.         movea.l    a5,a6            ; probase!
  159.         move.l    #PRF_Name,-(a7)        ; simulated tagitem for addevent 
  160.         bra.b    .arentry
  161. .arloop        move.l    a3,a0
  162.         move.l    d0,4(a7)
  163.         movea.l    a7,a1
  164.         bsr    AddEvent
  165. .arentry    move.l    (a4)+,d0
  166.         bne.b    .arloop
  167. .nar        addq.l    #8,a7
  168.         addq.l    #4,a7
  169.         move.l    a3,d0
  170.         
  171.         movem.l    (a7)+,d2/a2-a6
  172.         rts
  173. .fail        move.l    a3,a0
  174.         movem.l    (a7)+,d2/a2-a6
  175.  
  176.         Lib    DeleteProfilerHandler
  177.         move.l    a0,d0
  178.         beq.b    .no
  179.         movem.l    a2/a6,-(a7)
  180.         Exec
  181.         movea.l    a0,a2
  182.         movea.l    ph_TimerIO(a2),a1
  183.         Call    CloseDevice
  184.         movea.l    ph_TimerIO(a2),a0
  185.         Call    DeleteIORequest
  186.         movea.l    ph_TimerMSG(a2),a0
  187.         Call    DeleteMsgPort
  188.         movea.l    ph_Pool(a2),a0
  189.         Call    DeletePool
  190.         movem.l    (a7)+,a2/a6
  191. .no        rts
  192.  
  193.         Lib    AddEvent
  194.         movem.l    a2-a6,-(a7)
  195.         movea.l    a6,a5        ; a5:probase
  196.         Exec
  197.         movea.l    a1,a2        ; a2:tags
  198.         movea.l    a0,a3        ; a3:ph
  199.         movea.l    ph_Pool(a3),a0
  200.         moveq.l    #pe_SIZE,d0
  201.         Call    AllocPooled
  202.         move.l    d0,a4        ; a4:pe
  203.         tst.l    d0
  204.         beq.b    .fail
  205.         movea.l    prob_UtilityBase(a5),a6
  206.         GetTagData    PRF_Name,une,a2
  207.         move.l    d0,pe_Name(a4)        
  208.         clr.l    pe_Sum(a4)
  209.         clr.l    pe_Sum+4(a4)
  210.         movea.l    a4,a1
  211.         lea.l    ph_EventList(a3),a0
  212.         ADDTAIL
  213.         move.l    a4,d0
  214. .fail        movem.l    (a7)+,a2-a6
  215.         rts
  216.         
  217.         Lib    RemEvent    ; a0:ph,a1:pe
  218.         movem.l    a3/a6,-(a7)
  219.         movea.l    a0,a3
  220.         move.l    a1,d0
  221.         REMOVE
  222.         movea.l    d0,a1
  223.         movea.l    ph_Pool(a3),a0
  224.         moveq.l    #pe_SIZE,d0
  225.         Call    FreePooled
  226.         movem.l    (a7)+,a3/a6
  227.         rts
  228.  
  229.         Lib    NewCycle    ; a0:ph
  230.         move.l    a6,-(a7)
  231.         move.l    ph_EventList+MLH_HEAD(a0),ph_NextEvent(a0)
  232.         movea.l    ph_TimerBase(a0),a6
  233.         lea.l    ph_LastShot(a0),a0
  234.         Call    ReadEClock
  235.         movea.l    (a7)+,a6
  236.         rts
  237.  
  238.         Lib    EventReached    ; a0:ph
  239.         movea.l    ph_NextEvent(a0),a1    ; a1:pe
  240.         move.l    MLN_SUCC(a1),ph_NextEvent(a0)    
  241.         beq.b    EndCycle            ; cycle ended!
  242.         move.l    a6,-(a7)
  243.         movea.l    ph_TimerBase(a0),a6
  244.         exg    a0,a1            ; a0:pe a1:ph
  245.         movem.l    a0/a1,-(a7)
  246.         addq.l    #pe_ETime,a0
  247.         Call    ReadEClock
  248.         movem.l    (a7)+,a0/a1
  249.         move.l    pe_ETime+4(a0),d1
  250.         move.l    ph_LastShot+4(a1),d0
  251.         move.l    d1,ph_LastShot+4(a1)
  252.         sub.l    d0,d1
  253.         movea.l    d2,a6
  254.         move.l    pe_ETime(a0),d0
  255.         move.l    ph_LastShot(a1),d2
  256.         move.l    d0,ph_LastShot(a1)
  257.          subx.l    d2,d0
  258.          move.l    a6,d2
  259.          movem.l    d0/d1,pe_Duration(a0)
  260.          add.l    d1,pe_Sum+4(a0)
  261.          move.l    pe_Sum(a0),d1
  262.          addx.l    d0,d1
  263.         move.l    d1,pe_Sum(a0)
  264.         movea.l    (a7)+,a6
  265.         rts    
  266.  
  267.         Lib    EndCycle        ; a0:ph
  268.         addq.l    #1,ph_Cycles(a0)
  269.         rts
  270.  
  271.         Lib    CreateLog        ; a0:ph a1:tags
  272.         movem.l    d2-d7/a2-a6,-(a7)
  273.         movea.l    a6,a5            ; a5:probase
  274.         movea.l    a1,a2            ; a2:tags
  275.         movea.l    a0,a3            ; a3:ph
  276.         
  277.         movea.l    ph_TimerBase(a3),a6
  278.         subq.l    #8,a7
  279.         movea.l    a7,a0
  280.         Call    ReadEClock
  281.         addq.l    #8,a7
  282.          move.l    d0,d6            ; d6=e_freq
  283.         
  284.         movea.l    prob_UtilityBase(a5),a6
  285.         movea.l    a2,a0
  286.         move.l    ph_Output(a3),d1
  287.         move.l    #PRF_Output,d0
  288.         Call    GetTagData    
  289.         movea.l    prob_DOSBase(a5),a6
  290.         move.l    d0,d7            ; d7:fh
  291.         bne.b    .okfh
  292.         Call    Output
  293.         move.l    d0,d7            ; d7:default output
  294. .okfh        
  295.         move.l    d7,d1
  296.         move.l    #log_intro,d2
  297.         Call    FPuts
  298.         move.l    d7,d1
  299.         move.l    ph_Name(a3),d2        
  300.         Call    FPuts
  301.  
  302. WNHam        MACRO
  303.         move.l    d7,d1
  304.         move.l    #log_\1,d2
  305.         Call    FPuts
  306.         BrowseList    cl_Last\1,a4,ph_EventList(a3)
  307.         move.l    pe_Name(a4),d0
  308.         moveq.l    #32,d1
  309.         bsr    WriteName        
  310.         ENDM
  311. WNBurger    MACRO
  312.         mulu.l    #1000000,d2:d1
  313.         mulu.l    #1000000,d0
  314.         add.l    d2,d0            ; d0:d1=1^6*ticks
  315.         divu.l    d6,d0:d1
  316.         move.l    d1,d0
  317.         moveq.l    #9,d1            ; d0 must be 0 (or overflow)
  318.         lea.l    num,a0
  319.         bsr    WriteDec
  320.         move.l    d7,d1
  321.         move.l    #num,d2
  322.         Call    FPuts
  323.         move.l    d7,d1
  324.         move.l    #log_eventum,d2
  325.         Call    FPuts
  326.         BrowseListEnd    cl_Last\1,a4
  327.         ENDM
  328.                 
  329.         WNHam        last
  330.         movem.l    pe_Duration(a4),d0/d1
  331.         WNBurger    last
  332.  
  333.         WNHam        sum
  334.         movem.l    pe_Sum(a4),d0/d1
  335.         WNBurger    sum
  336.  
  337.         WNHam        avg
  338.         movem.l    pe_Sum(a4),d0/d1
  339.         divu.l    ph_Cycles(a3),d0:d1
  340.         moveq.l    #0,d0
  341.         WNBurger    avg
  342.             
  343.         movem.l    (a7)+,d2-d7/a2-a6    
  344.         rts    
  345.  
  346. ; d0:name d1:totlen d7:fh a6:dosbase
  347. WriteName    move.l    d6,-(a7)
  348.         move.l    d0,a0
  349. .loop        subq.l    #1,d1
  350.         tst.b    (a0)+
  351.         bne.b    .loop
  352.         move.l    d1,d6
  353.         move.l    d7,d1
  354.         move.l    d0,d2
  355.         Call    FPuts
  356. .points        move.l    d7,d1
  357.         move.l    #'.',d2
  358.         Call    FPutC
  359.         dbra    d6,.points
  360.         move.l    (a7)+,d6
  361.         rts
  362.  
  363. ; A0=buffer,D0=Num,D1=Cyfs
  364. Cyf        dc.b    'xx987654321'
  365. zc        dc.b    '0'
  366.         cnop    0,4
  367. WriteDec    movem.l    d2-d3,-(a7)
  368.         move.b    #'.',zc
  369.         moveq.l    #1,d2
  370.         moveq.l    #10,d3
  371.         clr.l    -(a7)
  372.         bra.b    .entry
  373. .divs        move.l    d2,-(a7)
  374.         mulu.l    d3,d2
  375. .entry        dbra    d1,.divs
  376. .dodivs        move.l    (a7)+,d1
  377.         beq.b    .end
  378.         moveq.l    #10,d2
  379.         bra.b    .dodiv
  380. .dodivp        move.b    #'0',zc
  381. .dodiv        sub.l    d1,d0
  382.         dbmi    d2,.dodivp
  383.         add.l    d1,d0
  384.         move.b    Cyf+1(pc,d2.w),(a0)+
  385.         bra.b    .dodivs
  386. .end        movem.l    (a7)+,d2-d3
  387.         rts
  388.                 
  389. utyname        dc.b    'utility.library',0
  390. dosname        dc.b    'dos.library',0
  391. timername    dc.b    'timer.device',0
  392. unp        dc.b    'None!',0
  393. une        dc.b    'Unknow',0
  394.  
  395. log_intro    dc.b    'profiler.library results.',10
  396.         dc.b    'profiled ',0
  397. log_last    dc.b    10,'last cycle results:',10,0
  398. log_sum        dc.b    10,'all cycles sum results:',10,0
  399. log_avg        dc.b    10,'average results:',10,0
  400. log_eventum    dc.b    ' µs',10,0
  401. num        dc.b    '.........',0
  402.  
  403.         Lib    END